約 2,787,541 件
https://w.atwiki.jp/dmc4/pages/12.html
実績ミッション Sランク 数 アイテム スキル ブラッディパレス 補足 実績 項目数 46 総ポイント 1000 XBOX360 実績解除スレまとめ @wiki http //www12.atwiki.jp/xbox360score/pages/380.html ミッション A Comfortable Pace ヒューマンモードのMISSION11までクリアする 10 Easy Does It ヒューマンモードをクリアする 10 Half Way There デビルハンターモードのMISSION11までクリアする 10 Done and Done デビルハンターモードをクリアする 20 Rock and a Hard Place サンオブスパーダモードのMISSION11までクリアする 10 Hardly A Simple Task サンオブスパーダモードをクリアする 30 Easier Said Than Done ダンテマストダイモードのMISSION11までクリアする 10 All Bow Before You ダンテマストダイモードをクリアする 40 Step into the Light ヘブンオアヘルモードをクリアする 10 Tonight, We Dine in Hell ヘルアンドヘルモードをクリアする 10 A Throne of Glory すべてのゲームモードをクリアする 50 Nothing Left Unsaid シークレットミッションをすべてクリアする 10 Speak of the Devil スーパーネロ(ダンテ)を使ってゲームをクリアする 20 Sランク Smokin ! スタイリッシュランクでSランクを出す 10 Smokin Style!! スタイリッシュランクでSSを出す 10 Smokin Sick Style!!! スタイリッシュランクでSSSを出す 10 Simply Spectacular ミッションをSランク獲得してクリアする 10 The Best of the Rest ヒューマンモードを全ミッションSランク獲得してクリアする 20 A Cut Above デビルハンターモードを全ミッションSランク獲得してクリアする 30 A Stunning Feat サンオブスパーダモードを全ミッションSランク獲得してクリアする 40 Never Say Die ダンテマストダイモードを全ミッションSランク獲得してクリアする 50 数 River of Red レッドオーブを1万個獲得する 10 Your Cup Runeth Over レッドオーブを10万個獲得する 20 Red Orb Millionaire レッドオーブを100万個獲得する 40 Filled with Pride プラウドソウルを1万個獲得する 10 Brimming with Pride プラウドソウルを10万個獲得する 20 Proud Millionaire プラウドソウルを100万個獲得する 40 Rookie Devil Hunter 敵を通算100体倒す 10 Skilled Devil Hunter 敵を通算1000体倒す 30 Legendary Devil Hunter 敵を通算10000体倒す 50 アイテム スキル Modus Vivendi 体力ゲージをMAXの長さにする 10 Bat Out of Hell デビルトリガーゲージをMAXの長さにする 10 Item Collector アイテムをすべてMAXまで所持する 50 Skill Collector - Nero ネロのスキルをすべて所持する 50 Skill Collector - Dante ダンテのスキルをすべて所持する 50 ブラッディパレス The First Circle ブラッディパレスを10ステージクリアする 10 The Second Circle ブラッディパレスを20ステージクリアする 10 The Third Circle ブラッディパレスを30ステージクリアする 10 The Fourth Circle ブラッディパレスを40ステージクリアする 10 The Fifth Circle ブラッディパレスを50ステージクリアする 10 The Sixth Circle ブラッディパレスを60ステージクリアする 10 The Seventh Circle ブラッディパレスを70ステージクリアする 10 The Eight Circle ブラッディパレスを80ステージクリアする 10 The Ninth Circle ブラッディパレスを90ステージクリアする 10 Covered in Blood ブラッディパレスを全ステージクリアする 40 King of the Palace ブラッディパレスをSランク獲得して全ステージクリアする 50 補足 ●「Rookie Devil Hunter」「River of Red」等はミッションクリア時に解除される ●「Item Collector」について レッドオーブを消費して購入するアイテムだけではなく各ミッション、武闘神像、シークレットミッションですべてのブルーオーブの欠片を入手する必要がある。 補足:軽いバグでホーリーウォーターだけはMAX所持しなくても解除される つまり無視してイイ。PC版では修正されて、ホーリーウォーターもMAX所持する必要がある。 ●「Speak of the Devil」はM20をクリアするだけで解除される(難易度はなんでもよい) ※DMDクリア後にでるスーパーネロ・スーパーダンテでクリアする
https://w.atwiki.jp/akasatanahama/pages/132.html
コンパイル時に、"ブートストラップ・クラスパスが-source 1.6と一緒に設定されていません"と出るのですがどうしたら良いのでしょうか? - mod初心者 2017-04-21 15 03 12 ちなみに上のはgradleの[compileJava, compileTestJava].eachのit.options.compilerArgs += ['-source', '1.7', '-target', '1.7']で直りましたけど、 - mod初心者 2017-04-21 15 26 51 「入力ファイルの操作のうち、未チェックまたは安全ではないものがあります。」が残ってます。上のは間違えました、['-source', '1.8', '-target', '1.8']です。 - mod初心者 2017-04-21 15 51 17 言い直すと、build.gradleの[compileJava, compileTestJava].eachのit.options.compilerArgs += ['-source', '1.8', '-target', '1.8']で直りましたが、「入力ファイルの操作のうち、未チェックまたは安全ではないものがあります。」が残ってます。 - mod初心者 2017-05-14 17 35 57 返信が遅くなってしまい申し訳ありません。ビルドが成功しているなら、そのままでも動作はするはずです。今回の場合、ConfigElementが総称型であるためにAluminiumModConfigGuiのコンストラクタにある以下の部分で警告が出ているようです。 (new ConfigElement(/* 略 */)).getChildElements()チュートリアルの該当部分を以下のように修正しましたので、ご確認ください。 (new ConfigElement Object (/* 略 */)).getChildElements()同様の警告は、以下をbuild.gradle内に追記することで、詳細を表示できます。 compileJava {options.compilerArgs += '-Xlint unchecked'}また、"ブートストラップ・クラスパスが…"の警告は、ビルド時に指定されたJavaのバージョンとビルドに使用しているバージョンが違うために発生しているようです。 - 赤砂蛇凪浜 2017-05-17 17 12 16 直りました!ありがとうございました! - Mod初心者 2017-05-18 18 32 47 メニュー画面のmodボタンを押しAluminiumModを選択すると、「disable」が赤くなります。 - mod初心者 2017-05-21 07 15 11 それは、FMLのMOD無効化ボタンです。MOD側が対応していないため赤くなるようです。@ModでcanBeDeactivatedをtrueにすると白くできます。しかし、FMLが機能を完成させておらず、利用できません。完成してもほとんどのMODが利用できないため、今後の更新も無いようです。 - 赤砂蛇凪浜 2017-05-24 14 18 02 そうなんですね。 - mod初心者 2017-05-24 15 14 13 分かりました。 - mod初心者 2017-05-24 15 14 43
https://w.atwiki.jp/wot_sengiken/pages/72.html
MOD名称 MODの概略 MOD名称機能 入手方法 導入方法 注意事項 使用イメージ コメント 機能 機能1 機能2 入手方法 入手方法1 入手方法2 導入方法 手順1 手順2 注意事項 注意事項1 注意事項2 使用イメージ コメント 名前 コメント すべてのコメントを見る
https://w.atwiki.jp/hs0nn/pages/33.html
仮?運用中です。(´・ω・`)導入しないと入れません。 内容に関しての質問は以下のチャットにて受付ます。 和風建築鯖-harka鯖-会議場 WEB支店 ※パスワードはマインクラフト内、もしくはスカイプ会議室で聞いて下さい(´・ω・`) 導入必須MOD一覧 1. MinecraftForge リンク:minecraftforge Downloads 2. 竹MOD リンク:Minecraft非公式日本ユーザーフォーラム サーバのバージョン:竹mod ver2.6.0.2Universal(minecraft1.4.7) ※ 1.4.7版レシピ:マインクラフトwiki(バックアップ) 3. モミジMOD リンク:Minecraft非公式日本ユーザーフォーラム サーバのバージョン:[1.4.6]MapleTree Forge v1.1.9 ※通常版を入れないで下さい。下の説明にどのファイルをDLするのか書いてあります。 落としたファイルをもう一度よく見て。そのファイル名にForgeって文字が入ってますか? ※導入推奨MOD一覧 4. NihongoMOD リンク:Minecraft非公式日本ユーザーフォーラム ※竹MOD・モミジMODと同じようにmodsフォルダに置くだけで日本語が打てるようになります。 ModLoaderとIMを使ってたけどForgeにしてIM消えた!って人向け。 導入する前に ファイルをダウンロードする前に、自分の利用状況を確認してください。 A. Minecraft.jarに全く手を付けた事がなく、modsフォルダも空 B. Forgeは入れた事が無いけど、MODLoaderが入っている。 (minefraft.jarの中にファイルを導入した事がある) C. Forgeが入っている。もしくは入れた事がある。 → Aの人 …この後の1から3までを全て対応して下さい。 → Bの人 …minecraft.jarからmodloaderを消す必要がります。 今のminecraft.jarを「minecraft_old.jar」等にリネームして、 再度マインクラフトを起動しバニラなminecraft.jarを取得して下さい。 もしバックアップを取得しているのであれば、それに差し替えて下さい。 ※Forgeの中にmodloaderと同様の機能があり、既存MODもほぼ対応しています。 もし動かなかった場合は、それぞれのMODページからForge対応版をDLして下さい。 無かった場合は…諦めて下さい(´・ω・`) → Cの人 …最新でなければ最新のForgeを再度導入し、竹MODおよびモミジMODをダウンロードして modsフォルダに置いて下さい。 ※利用バージョンは上記「導入必須MOD一覧」参照 ★重要★ まず最初に、必ずバックアップを取得して下さい。 ※.minecraftフォルダの中にbinフォルダがあり、その中にある「minecraft.jar」と言うファイルです。 「minecraft_1.4.X.jar」等のそれぞれのバージョンでわかりやすく管理すると便利です。 注意 「.jar」って付いてるファイルがない!って人は拡張子が非表示の設定になってるだけです。 binフォルダ内にある「minecraft」と言うファイルが該当します。 また、導入順序として、バニラの状態からだと Forge→optifine等の軽量化MOD→メタ(META-INF)削除→その他MOD となります。 もしoptifineが既に導入されているが、Forgeが入っていない、と言う場合は、 Forge導入後、再度optifine→その他MODと上書きして下さい。 導入方法 1. MinecraftForge ① minecraftforge Downloadsより、MinecraftFrogeをダウンロードします。 ※リンク先は転送ページなので、数秒すると右上に下記ボタンが表示されるのでクリック ② 日本語MOD導入ページの①から⑤までを行います。 ③ 先ほどダウンロードしたForgeを同様に解凍し、minefraft.jarの中に入れます。 ※日本語MOD導入ページの⑥・⑦のやり方です。 ④ minefraft.jarの中にあるMETA-INFフォルダを削除します。 ※日本語MOD導入ページの⑧のやり方です。 ⑤ 全て終わったら、一度マインクラフトを起動して下さい。 FMLのバージョンチェックやらが走りますが、眺めておきましょう。 何もしなくてOKです。 導入が成功すると下記のように表示されます。 これでForgeの導入は完了です。 ※optifine等、軽量化MODを利用する際には、必ずForgeを導入してから入れて下さい。 2. 竹MOD ① Minecraft非公式日本ユーザーフォーラムより、竹MODをダウンロードします。 ※なお、必ずしも最新版とは限らない場合があります。 上記「導入必須MOD一覧」に書かれている、サーバと同一のバージョンを利用して下さい。 ② .minefraftフォルダ(日本語MOD導入ページの②)の中にあるmodsフォルダを開き、 その中に先ほどダウンロードした竹MODを「zipファイルのまま」置いて下さい。 zipファイルは解凍しないで下さい。また、jarファイルに直接入れる必要もありません。 ※もしmodsフォルダが無い!と言う場合は、自分で「mods」というフォルダを作って下さい。 これで竹MODの導入は完了です。 3. モミジMOD ① Minecraft非公式日本ユーザーフォーラムより、モミジMODをダウンロードします。 Forge版が必要なので、上部のダウンロードリストじゃありません。 下部にある「◆MinecraftForge universal版[マルチ対応]」を選択します。 表示選択後、展開された中にあるモミジMOD(universal版)をダウンロードします。 ※なお、必ずしも最新版とは限らない場合があります。 上記「導入必須MOD一覧」に書かれている、サーバと同一のバージョンを利用して下さい。 ② .minefraftフォルダ(日本語MOD導入ページの②)の中にあるmodsフォルダを開き、 その中に先ほどダウンロードした竹MODを「zipファイルのまま」置いて下さい。 zipファイルは解凍しないで下さい。また、jarファイルに直接入れる必要もありません。 ※modsフォルダ中には竹MODのzipとモミジMODのzip、二つが入ってればおっけーです。 これでモミジMODの導入は完了です。 動作確認 サーバへログイン出来れば成功です。 ①導入したバージョンが違う場合 上記のように、サーバのMODのバージョンが表示されます。 正しいMODをダウンロードして、modsフォルダに置いて下さい。 ②MODが置かれていない場合 MOD自体が読み込めないため、エラーを吐き出します。 ※フォントの関係上もあり、全て表示されていませんが… こうなったらmodsフォルダにMODが置かれていない、またはダウンロードしたファイルが 壊れている可能性があります。 再度ダウンロードしてmodsフォルダに設置して下さい。 以上で必須MODの導入は完了です。 上手くいきましたか? これでも駄目な場合、上部のweb会議室で質問して貰えれば頑張って答えます(´・ω・`) それでは、よいマインクラフトライフを! 今日: - 昨日: - 合計: -
https://w.atwiki.jp/bonosaba/pages/25.html
configファイル(MODの設定ファイル) MODを導入したあと、マイクラを起動すると.minecraftフォルダの中のconfigフォルダ内にpaintball.cfgというファイルが作られます。 そこに以下のファイルをダウンロードして入れ替えてください。 ダウンロード→paintball.cfg または、メモ張でpaintball.cfgを開いて以下のように数値を書き換えてください。 item { Blue=1891 Green=1859 Orange=1795 Other=1762 Purple=1923 Red=1763 Yellow=1827 } 前提MOD「Minecraft Forge」を入れよう。 ダウンロードしたフォージを解凍して中身をminecraft.jarの中に入れるのだが詳しいことは「Minecraftフォージ 導入」とググってみよう。 Paint ball MODをダウンロードしよう 以下のサイトでダウンロードします。 1.4.2v1- ~ Paintball ~ Gun Adjustments and Half a Million Downloads! ↓ ページの中段くらいにある Downloads の下、「universal Files」をクリックしてダウンロードします。 ↓ ダウンロードしたファイルを解凍。解凍したファイルに「Paintball.zip」があるのでこれをmodsフォルダに入れます。 ↓ マイクラ起動で正常に動けば成功。 Minecraft.jarを解凍ソフトで開く ダウンロードしたフォージを解凍し、解凍されたファイルをMinecraft.jarの中に入れる。 Minecraft.jarの中のMETA-INFは削除する。 この時点で一度起動し、マイクラのメニュー画面右下に「FML v○.○○」と表示されていれば導入できてる。 次に入れたいMODをダウンロードする。 ダウンロードしたファイルを.minecraftフォルダにmodsフォルダをつくり、そのフォルダにMODを入れる。 マイクラを起動し、シングルで新しいアイテムなど追加されていれば導入できてる。 ログイン画面でとまる→フォージが正しく導入できてない .mineraftフォルダの場所がわからん→マイクラメニュー画面のテクスチャパックを押すとフォルダが表示される。そのフォルダの階層を1つ戻ればよい
https://w.atwiki.jp/darwinian/pages/29.html
公式MOD製作フォーラム http //forums.introversion.co.uk/darwinia/viewforum.php?f=12? The Next Game http //thenextgame.co.uk/? Nihils Darwinia Modding Pages http //www.nihilesthetics.info/DarwiniaModding/ModdingDarwinia.htm? stellarmatter.net http //stellarmatter.net/? Darwinia Shape Marker List http //www.cyberdyne.homecall.co.uk/shape_index.htm? darwikia http //freepgs.com/trickfred/darwikia/index.php?
https://w.atwiki.jp/sperkbird/pages/4.html
導入MOD ・前提MOD Minecraft Forge(6.6.0.xxx) http //www26.atwiki.jp/minecraft/pages/340.html └ForgeModLoader(4.7.3.519) Forgeに内蔵、一部環境で不具合のあったため記載 ・各種MOD BuildCraft(3.4.0) │http //www26.atwiki.jp/minecraft/pages/189.html └LogisticsPipes(0.7.0.77) BCaddon パイプ要素の追加 http //www26.atwiki.jp/minecraft/pages/955.html IndustrialCraft2(1.112.170lf) │http //www26.atwiki.jp/minecraft/pages/322.html ├Gregtech-addon(2.72c) IC2addon 難易度増加 │http //www26.atwiki.jp/minecraft/pages/853.html └Modular ForgeField System(2.2.8.2.16) IC2addon バリア発生装置など ※System「s」ではないので注意 http //www26.atwiki.jp/minecraft/pages/904.html Myst Craft(0.9.5.00) 公式サーバ用マルチワールドMOD http //www26.atwiki.jp/minecraft/pages/552.html ・推奨MOD CraftGuide(1.6.5.12) http //www.minecraftforum.net/topic/731133-
https://w.atwiki.jp/kasogame/pages/36.html
Source MODはHL2などのSource Engineを利用したゲームを購入すると、 STEAM→ライブラリ→ツールの方からダウンロードができるようになるSource SDKを必要とします。 Source SDKにもいろいろ種類があるので注意 とりあえずThe Orange Boxを買っておけば、大丈夫だと思われる。 GoldenEye Source Coven Modular Combat NEOTOKYO° Obsidian Conflict Suicide Survival Battle Grounds 2 Synergy
https://w.atwiki.jp/stalker_cop/pages/167.html
MOD - バグFix MOD - バグFixCrows 'bugfix' Unreachable Stash Fix Mod CoPのライフル類のアイアンサイトを正しい位置に調整してみたMOD correct ironsights Crows bugfix http //www.filefront.com/15654565/stalker_cop_1602_crowfix.zip カラスが大量発生するバグに対応しているようです。 http //www.gsc-game.com/index.php?t=community s=forums s_game_type=xr3 thm_page=1 thm_id=1997 sec_id=19 Unreachable Stash Fix Mod http //www.mediafire.com/?imwqtdymtmd 2箇所の回収できないStashをなんとかするMod。 ニューゲーム必須なので予防でしかありませんが、 Zatonの"岩に埋まる包帯"と、Jupiterの"トラックにめり込んだ物資"にお悩みの方に。 ↓で今後もその手のStashへの対応を追加していくようです。 http //www.gsc-game.com/index.php?t=community s=forums s_game_type=xr3 thm_page=1 thm_id=1562 sec_id=18 CoPのライフル類のアイアンサイトを正しい位置に調整してみたMOD アイアンサイトとレティクル中心のズレを解消するMOD http //u6.getuploader.com/stalker/download/21/Ironsight.rar こちらは上の奴の新バージョンで、PKMもエイム可能になったらしい。 http //u6.getuploader.com/stalker/download/26/Ironsight2.rar correct ironsights http //u6.getuploader.com/stalker/download/60/correct+ironsights.zip 上のアイアンサイト調整Modと、↓のModをマージして値を弄ったもの。 http //stalker.filefront.com/file/Fixed_Iron_Sights_All_Resolutions;111153
https://w.atwiki.jp/akasatanahama/pages/137.html
概要 Minecraft内のクラス書き換えインターフェイス、"IClassTransformer"を用いてバニラクラスの書き換えを行う。 このチュートリアルはとても難解な内容を含んでいます。 中級編までをひとしきり出来るようになってから挑戦してください。 バニラクラスを書き換えるため競合に注意して行ってください。 事前準備 今回は事前の準備が幾つか必要である。 まず、クラス書き換え用の別ディレクトリをsrc/main/java内に作成する。今回はalcore.asmとする。 ディレクトリを分けずにやると正しく読み込めなくなるため必ずディレクトリを分ける。 次に、coremodとして働かせる(→クラス書き換え用に通常のMODより早く読み込む)MODとして、開発環境とビルド環境にそれぞれ読み込ませる。 今回はcoremodのクラスをalcore.asm.ALCorePluginとする。 ビルド環境 MODのjarファイル内に情報を埋め込めるよう、build.gradleファイルの末尾に以下のコードを追加する。 //manifestファイルの書き込みをビルドに追加する。これにより、coremodの読み込みが可能になる。 //なお、テスト起動時にはこのオプションが効かないためVMオプションに以下の引数を追加する。 //-Dfml.coreMods.load=alcore.asm.ALCorePlugin jar { manifest { //coremodのパスを指定する。 attributes FMLCorePlugin alcore.asm.ALCorePlugin //今回はAluminiummodが別で入っているためそれも読み込む。 attributes FMLCorePluginContainsFMLMod true } } 開発環境 開発環境では上記のものが効かないためVMオプションに以下の引数を追加する。 -Dfml.coreMods.load=alcore.asm.ALCorePlugin ソースコード 今回は、ディレクトリ"tutorial.aluminiummod"でアイテムの追加とレシピの追加及び鉱石の追加を参考にアルミニウムインゴット、アルミニウム鉱石とその精錬レシピまでを実装してある前提で解説する。 もしそこまでのやり方がわからない場合は、一旦上記三つのチュートリアルをよく読んでから戻ってきていただきたい。 ALCorePlugin.java package alcore.asm; import cpw.mods.fml.relauncher.IFMLLoadingPlugin; import java.util.Map; public class ALCorePlugin implements IFMLLoadingPlugin { //書き換え機能を実装したクラス一覧を渡す関数。書き方はパッケージ名+クラス名。 @Override public String[] getASMTransformerClass() { return new String[]{"alcore.asm.ALCoreTransformer"}; } //あとは今回は使わない為適当に。 @Override public String getSetupClass() { return null; } @Override public void injectData(Map String, Object data) { } @Override public String getAccessTransformerClass() { return null; } @Override public String getModContainerClass() { return null; } } ALCoreTransformer.java package alcore.asm; import cpw.mods.fml.common.asm.transformers.deobf.FMLDeobfuscatingRemapper; import net.minecraft.launchwrapper.IClassTransformer; import org.objectweb.asm.*; import static org.objectweb.asm.Opcodes.*; public class ALCoreTransformer implements IClassTransformer { //IClassTransformerにより呼ばれる書き換え用のメソッド。 @Override public byte[] transform(final String name, final String transformedName, byte[] bytes) { //対象クラス以外を除外する。対象は呼び出し元があるクラスである。 if (!"net.minecraft.tileentity.TileEntityFurnace".equals(transformedName)) return bytes; ClassReader cr = new ClassReader(bytes); ClassWriter cw = new ClassWriter(1); ClassVisitor cv = new ClassVisitor(ASM4, cw) { //クラス内のメソッドを訪れる。 @Override public MethodVisitor visitMethod(int access, String methodName, String desc, String signature, String[] exceptions) { MethodVisitor mv = super.visitMethod(access, methodName, desc, signature, exceptions); //呼び出し元のメソッドを参照していることを確認する。 String s1 = FMLDeobfuscatingRemapper.INSTANCE.mapMethodName(name, methodName, desc); //C \Users\ ユーザー名 \.gradle\caches\minecraft\net\minecraftforge\forge\1.7.10-10.13.4.1558-1.7.10\forge-1.7.10-10.13.4.1558-1.7.10-decomp.jar\より名称を検索、比較してメソッドの難読化名を探す。 if (s1.equals("updateEntity") || s1.equals("func_145845_h") || methodName.equals("updateEntity") || methodName.equals("func_145845_h")) { //もし対象だったらMethodVisitorを差し替える。 mv = new MethodVisitor(ASM4, mv) { //呼び出す予定のメソッドを読み込む。 @Override public void visitMethodInsn(int opcode, String owner, String methodName, String desc, boolean itf) { //書き換え対象のメソッドであることを確認する。 String s2 = FMLDeobfuscatingRemapper.INSTANCE.mapMethodName(name, methodName, desc); if (s2.equals("isBurning") || s2.equals("func_145950_i") || methodName.equals("isBurning") || methodName.equals("func_145950_i")) { //引数として次に渡す値にthisを指定する。 mv.visitVarInsn(ALOAD, 0); //メソッドを読み込む。INVOKESTATICでstaticメソッドを呼び出す。 super.visitMethodInsn(INVOKESTATIC, "alcore/asm/ALCoreHook", "ALFurnaceHook", Type.getMethodDescriptor(Type.VOID_TYPE, Type.getObjectType("net/minecraft/tileentity/TileEntity")), false); //今回はフックを差し込むだけだが、ここで書き換えも出来る。 } //今回は最後に元のクラスを読み込んでreturnする。 super.visitMethodInsn(opcode, owner, methodName, desc, itf); } }; } return mv; } }; cr.accept(cv, ClassReader.EXPAND_FRAMES); return cw.toByteArray(); } } ALCoreHook.java package alcore.asm; import net.minecraft.entity.item.EntityItem; import net.minecraft.init.Blocks; import net.minecraft.init.Items; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.tileentity.TileEntity; import net.minecraft.tileentity.TileEntityFurnace; import tutorial.aluminiummod.AluminiumMod; public class ALCoreHook { //差し込むフック。フック内の詳細は割愛。簡単に言うと、鉄鉱石とアルミニウムインゴットがある状態で火がついていたら爆発して鉄を撒き散らす。 public static void ALFurnaceHook(TileEntity tileEntity) { if (tileEntity instanceof TileEntityFurnace) { TileEntityFurnace furnace = ((TileEntityFurnace) tileEntity); if (furnace.furnaceBurnTime 0 furnace.getStackInSlot(0) != null furnace.getStackInSlot(0).getItem() == Item.getItemFromBlock(Blocks.iron_ore) furnace.getStackInSlot(2) != null furnace.getStackInSlot(2).getItem() == AluminiumMod.aluminium) { furnace.setInventorySlotContents(0, null); furnace.setInventorySlotContents(1, null); furnace.setInventorySlotContents(2, null); if (!furnace.getWorldObj().isRemote) { furnace.getWorldObj().newExplosion(null, furnace.xCoord, furnace.yCoord, furnace.zCoord, 15, true, true); EntityItem entityItem = new EntityItem(furnace.getWorldObj(), furnace.xCoord, furnace.yCoord, furnace.zCoord, new ItemStack(Items.iron_ingot, furnace.getWorldObj().rand.nextInt(32) + 32)); entityItem.fireResistance = Integer.MAX_VALUE; furnace.getWorldObj().spawnEntityInWorld(entityItem); } } } } } 解説 ALCorePlugin.java public String[] getASMTransformerClass() 書き換えするコードを記述したIClassTransformerを実装してあるクラスを渡す。 配列形式であるため、トランスフォーマーはいくつも追加することが出来る。 public String getModContainerClass() 今回はModとして見えないように実装するため、nullを返してある。 もしModとして見えるようにする(CodeChickenCoreのように別MODとしてリリースする)ならば、DummyModContainerを継承したクラス名をStringで渡す。 ex. "alcore.asm.ALModContainer" ALCoreTransformer.java public byte[] transform(final String name, final String transformedName, byte[] bytes) 書き換えの実態を担うクラス。引数は クラス名、易読化クラス名、バイトコードである。 バイトコードはそのままでは読めない読めたらすごいため、 ClassReader(バイトコードをASMで読めるようにする)→ClassWriter(ClassReaderを書き出せるようにする)→ClassVisitor(内部クラスでクラスを書き換えられるようにする) と手順を踏んで使えるようにする。 最終的にClassWriterをバイトコードに書き出して返す。 間違って別のクラス・メソッドを書き換えてしまってはいけないため、名称でのチェックが必要。 FMLDeobfuscatingRemapper public String mapMethodName(String owner, String name, String desc) クラス名、難読化されたメソッド名、引数記述Type(後述)の順で引数を与えて易読化メソッド名を返す…… はずなのだが、forge1.7.10だと何故かうまく動かない事がある。そのため、コメントの通り難読化されたソースコードと易読化されたものを比較し、難読化名も判定しておいたほうがいい。 ClassVisitor public MethodVisitor visitMethod(int access, String methodName, String desc, String signature, String[] exceptions) ここで、呼び出し元のメソッドをチェックする。今回は"onUpdateEntity"から呼ばれた"isBurning"に対して書き換えを施しているが、もし無差別にあるメソッドを書き換えるならif節は不要。 MethodVisitor public void visitMethodInsn(int opcode, String owner, String methodName, String desc, boolean itf) メソッド内での呼び出しされたメソッドを訪れる。 同様にintやstringなども訪れることが出来る(Methodvisitorのソース参照)。 ここで他のメソッドを呼び出してやることで、書き換えが実現できる。 ビルド・コンパイル coremodが正しく読み込まれているならば以下が出力されているはずである。テストプレイ時はまずこれをチェックしてみてほしい。 Found a command line coremod alcore.asm.ALCorePlugin また、このデータをjarファイルにコンパイルしたらMinecraftのディレクトリにあるmodsフォルダに入れてテストプレイをしたほうが良い。 難読化の都合上環境を変えるとうまく動かないためである。 不具合がある場合はロガーやSystem.out.printInを使って引数や変数の内容を出力させてみるのも手である。 コメント この項目に関する質問などをどうぞ。 名前